home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / c / cwd.c < prev    next >
Internet Message Format  |  1988-08-15  |  5KB

  1. Date: Tue, 12 Jul 88 17:45:08 cdt
  2. From: wucs1!wubios!david@uunet.UU.NET (David Camp)
  3. Subject: CWD.C
  4.  
  5. *-------------------------------------------------------------------------*
  6. | (314) 362-3635                     Mr. David J. Camp                    |
  7. | Room 1108D               ^         Box 8067, Biostatistics              |
  8. | 706 South Euclid       < * >       Washington University Medical School |
  9. |                          v         660 South Euclid                     |
  10. | Bitnet: david%wubios@wucfua.wustl  Saint Louis, MO 63110                |
  11. | Internet: david%wubios@wucfua.wustl.edu                                 |
  12. *-------------------------------------------------------------------------*
  13.  
  14. /* CWD.C -- program to implement Kermit-like CWD command for MS-Dos */
  15. /* Written by David J. Camp, Washington University Division of Biostatistics */
  16. /* 1988 for Microsoft C 5.0 */
  17.  
  18. /*
  19.      I have sent you CWD.C and CWD.EXE.  CWD works much like the Kermit
  20. CWD command.  It lets you change both the drive and the directory with one
  21. command.  Its main advantage is that it allows a trailing slash '/' or
  22. backslash 'c' after the specified path.  This allows for easier MAKE
  23. files.  If you have a MAKE macro defined to be a pathname, you may wish to
  24. do several things with it.  For instance, you may wish to change
  25. directories, or append it to a file name.  If you append it to a file
  26. name, you must insert an intervening backslash.  If the selected directory
  27. is the root, you will wind up with two backslashes.  An alternate method
  28. is to end all pathnames with a backslash.  Then appending to filenames
  29. works (without the intervening backslash), but you cannot change
  30. directories.  CWD solves that problem by allowing an optional trailing
  31. backslash in the selected pathname.  I believe CWD will allow the use of
  32. slashes instead of backslashes in the pathname.  Enjoy!
  33.  
  34. *-------------------------------------------------------------------------*
  35. | (314) 362-3635                     Mr. David J. Camp                    |
  36. | Room 1108D               ^         Box 8067, Biostatistics              |
  37. | 706 South Euclid       < * >       Washington University Medical School |
  38. |                          v         660 South Euclid                     |
  39. | Bitnet: david%wubios@wucfua.wustl  Saint Louis, MO 63110                |
  40. | Internet: david%wubios@wucfua.wustl.edu                                 |
  41. *-------------------------------------------------------------------------*
  42.  
  43. */
  44.  
  45. #include <readable.h>   /* See below */
  46. #include <stdio.h>
  47. #include <direct.h>
  48. #include <dos.h>
  49.  
  50. main (argc, argv)
  51. int argc;
  52. char * argv [];
  53.  
  54. begin
  55. char path [256];        /* holds path for getcwd */
  56. int drive;              /* integer drive number */
  57. unsigned drives;        /* holds number of drives returned from _dos_setdrive */
  58. int pathlen;            /* length of specified path minus one */
  59.  
  60. /* if no arguments is given then */
  61. if (argc eq 1)
  62.     begin
  63.     /* type the current drive and directory. */
  64.     fprintf (stdout, "%s\n", getcwd (path, 256));
  65.     end
  66. /* Else if one argument is given then */
  67. else if (argc eq 2)
  68.     begin
  69.     /* Allow trailing slashes. */
  70.     pathlen = strlen (argv [1]) - 1;
  71.     if (argv [1] [pathlen] eq '\\' or argv [1] [pathlen] eq '/')
  72.         if (pathlen > 0 and argv [1] [pathlen - 1] != ':')
  73.             argv [1] [pathlen] = '\0';
  74.     /* Change to the new directory. */
  75.     chdir (argv[1]);
  76.     /* If the drive is specified then */
  77.     if (argv [1] [1] eq ':')
  78.         begin
  79.         /* also change the drive. */
  80.         drive = argv [1] [0];
  81.         /* One must calculate the drive number from the drive letter. */
  82.         if ('A' <= drive and drive <= 'Z' or 'a' <= drive and drive <= 'z')
  83.             begin
  84.             /* If lower case then */
  85.             if ('a' <= drive)
  86.                 /* convert to upper case. */
  87.                 drive = drive - 32;
  88.             /* Convert to drive number. */
  89.             drive = drive - 64;
  90.             /* MSC 5.0 routine to change the current drive is _dos_setdrive */
  91.             _dos_setdrive (drive, &drives);
  92.             end
  93.         /* else drive name is invalid */
  94.         else
  95.             begin
  96.             /* Type a message and quit. */
  97.             fprintf (stderr,"Drive name must be a letter\n");
  98.             exit (1);
  99.             end
  100.         end
  101.     end
  102. /* else there are greater than one arguments. */
  103. else
  104.     begin
  105.     /* Type a message and quit. */
  106.     fprintf (stderr, "usage: CWD d:path\n");
  107.     exit (1);
  108.     end
  109. /* This is the normal exit for when everything goes right. */
  110. exit (0);
  111. end
  112. /* readable.h is as follows:
  113. #define begin {
  114. #define end }
  115. #define and &&
  116. #define or ||
  117. #define not !
  118. #define eq ==
  119. */
  120.